﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CPTECH.Business;
using System.Collections;
using CPTECH.Repository;

namespace CPTECH.Presentation
{
    public partial class frm_cCusto : frm_default
    {
        int fluxo = 0;
        frm_validarInv validar = new frm_validarInv();
        frm_alterarItem alterar = new frm_alterarItem();

        public frm_cCusto(frm_alterarItem sendedAlterar, frm_validarInv sendedValidar, int sendedFluxo)
        {
            InitializeComponent();
            
            fluxo = sendedFluxo;
            alterar = sendedAlterar;
            validar = sendedValidar;
        }

        //chama método que popula o list box.
        private void frm_cCusto_Load(object sender, EventArgs e)
        {
            showCcusto();
        }

        //volta para o form anterior
        private void menuItem1_Click(object sender, EventArgs e)
        {
            this.closeForm();//usa método herdado.
        }

        //chama método que salva e segue para o proximo form.
        private void menuItem2_Click(object sender, EventArgs e)
        {
            checkAndSave();
        }

        //seta o valor selecionado nos textBox.
        private void lst_Ccusto_SelectedIndexChanged(object sender, EventArgs e)
        {
            string[] custoSeparado = lst_Ccusto.SelectedItem.ToString().Split('=');

            txt_codCcusto.Text = "";
            txt_codCcusto.Text = custoSeparado[0].Trim();
            txt_descCcusto.Text = "";
            txt_descCcusto.Text = custoSeparado[1].Trim();
        }

        //método que efetua verificação, salva e chama  o form seguinte
        private void checkAndSave()
        {
            if (txt_codCcusto.Text == "" || txt_descCcusto.Text == "")
            {
                MessageBox.Show("Selecione um Centro de Custo para continuar!", "Aviso");
            lst_Ccusto.Focus();
            }
            else
            {
                //checa se o fluxo que o chamou foi (inventário).
                if (fluxo == 0)
                {
                    FisicoBO.getInstance().codCcusto = txt_codCcusto.Text;

                    //chama form seguinte.
                    //checa pra ver se  o formulário Planta foi marcado para ser chamado.
                    if (FisicoBO.getInstance().ckPlanta)
                    {
                        frm_planta planta = new frm_planta(null, null, 0);//craia instancia do novo form.
                        planta.showForm(this);//exibe o form novo.
                    }

                    //chama o formulário de Fisico.
                    else
                    {
                        frm_fisico fisico = new frm_fisico();//cria instancia do novo form.
                        fisico.showForm(this);//exibi form novo.
                    }
                }
                //checa se o fluxo que o chamou foi (re- inventário).
                else if (fluxo == 1)
                {
                    validar.sendedValues("ccusto", txt_codCcusto.Text.Trim());
                    this.closeForm();
                }
                //interpleta como (alteração).
                else
                {
                    alterar.sendedValues("ccusto", txt_codCcusto.Text.Trim());
                    this.closeForm();
                }
            }
        }

        //verifica campos.
        private bool verificaCampos()
        {
            bool campos = false;

            if (txt_codCcusto.Text == "")
            {
                MessageBox.Show("Insira um código de Centro de Custo para continuar!", "Centro de Custo");
                txt_codCcusto.Focus();
            }

            else if (txt_descCcusto.Text == "")
            {
                MessageBox.Show("Insira uma descrição de Centro de Custo para continuar!", "Centro de Custo");
                txt_descCcusto.Focus();
            }
            else
            {
                campos = true;
            }

            return campos;
        }

        //muda botão de add para salvar e habilita os campos para inserção.
        private void activeInsert()
        {
            lst_Ccusto.Enabled = false;
            bt_cancelar.Visible = true;
            txt_codCcusto.Enabled = true;
            txt_codCcusto.Text = "";
            txt_descCcusto.Enabled = true;
            txt_descCcusto.Text = "";
            txt_codCcusto.Focus();
            bt_add.Text = "Salvar";
        }

        //muda opção de salvar para add e desabilita os campos pra inserção.
        private void desactiveInsert()
        {
            lst_Ccusto.Enabled = true;
            bt_cancelar.Visible = false;
            txt_codCcusto.Enabled = false;
            txt_codCcusto.Text = "";
            txt_descCcusto.Enabled = false;
            txt_descCcusto.Text = "";
            lst_Ccusto.Focus();
            bt_add.Text = "Add";
        }

        //método que popula a list Box.
        private void showCcusto()
        {
            lst_Ccusto.Items.Clear();
            ArrayList resultado = CentroCustoDB.getInstance().selectAllCcusto();

            for (int i = 0; i < resultado.Count; i++)
            {
                lst_Ccusto.Items.Add(resultado[i].ToString());
            }
        }

        //checa texto (habilita para o insert *Add || ou salva o mesmo *Salvar)
        private void bt_add_Click(object sender, EventArgs e)
        {
            if (bt_add.Text == "Add")
            {
                activeInsert();
            }
            else
            {
                string os = FisicoBO.getInstance().os;
                string codFilial = FisicoBO.getInstance().codFilial;
                Int64 codCcusto = Int64.Parse(txt_codCcusto.Text);
                string descCcusto = txt_descCcusto.Text.ToUpper();
                string data = DateTime.Now.ToString("yyyy-MM-dd");

                if (CentroCustoDB.getInstance().checkCodCcusto(codCcusto))
                {
                    MessageBox.Show("Este código de Centro de Custo já existe, favor informar um novo!", "Centro de Custo");
                    txt_codCcusto.Text = "";
                    txt_codCcusto.Focus();
                }
                else if (verificaCampos())
                {
                    bool resposta = CentroCustoDB.getInstance().insertNewCcusto(os, codCcusto, descCcusto, data, 1);

                    if (resposta == true)
                    {
                        desactiveInsert();
                        MessageBox.Show("Centro de Custo inserido com sucesso!", "Centro de Custo");
                        txt_codCcusto.Text = codCcusto.ToString();
                        txt_descCcusto.Text = descCcusto;
                        showCcusto();
                    }

                    else if (resposta == false)
                    {
                        MessageBox.Show("Não foi possível adicionar o Centro de Custo, cheque os valores informados!", "Centro de Custo");
                        txt_codCcusto.Focus();
                    }
                }
            }

        }

        //chama o método  que cancela o insert de novo Centro de custo.
        private void bt_cancelar_Click(object sender, EventArgs e)
        {
            desactiveInsert();
        }

        //permite apenar inserção de números
        private void txt_codCcusto_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
                MessageBox.Show("Somente números são permitidos neste campo!", "Aviso");
                txt_codCcusto.Text = "";
                txt_codCcusto.Focus();
            }  
        }
    }
}